www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Samples/AviFrames/AviPlayer.cpp

    //Download by http://www.NewXing.com
// AviPlayer.cpp: implementation of the CAviPlayer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "aviframes.h"
#include "AviPlayer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNCREATE( CAviPlayer, CObject );

//////////////////////////////////////////////////////////////////////////

CAviPlayer::CAviPlayer(CWnd *pWndParent)
	: m_pAviStream( NULL )
	, m_pGetFrame( NULL )
	, m_nAviWidth( 0 )
	, m_nAviHeight( 0 )
	, m_nRenderWidth( 0 )
	, m_nRenderHeight( 0 )
	, m_hDrawDib( NULL )
	, m_nFrameNumber( 0 )
	, m_nFrameCount( 0 )
	, m_nFrameSkiped(0)
	, m_pAviPlayerWnd(NULL)
	, m_bIsPlaying( FALSE )
	, m_bTempPause( FALSE )
{
	AVIFileInit();

	m_pAviPlayerWnd = new CAviPlayerWnd(this);
	m_pAviPlayerWnd->Create( pWndParent	);
	
}

//////////////////////////////////////////////////////////////////////////

CAviPlayer::~CAviPlayer()
{
	if( m_pAviPlayerWnd ){
		m_pAviPlayerWnd->DestroyWindow();
		delete m_pAviPlayerWnd;
		m_pAviPlayerWnd = NULL;
	}
	Clean();
	AVIFileExit();
}

//////////////////////////////////////////////////////////////////////////

void CAviPlayer::Clean()
{
	if( m_hDrawDib != NULL ){
		::DrawDibClose( m_hDrawDib );
		m_hDrawDib = NULL;
	}
	if( m_pGetFrame != NULL ){
		::AVIStreamGetFrameClose( m_pGetFrame );
		m_pGetFrame = NULL; 
	}
	if( m_pAviStream != NULL ){
		::AVIStreamRelease( m_pAviStream );
		m_pAviStream = NULL;
	}
	::DrawDibEnd(m_hDrawDib);
	::DrawDibClose(m_hDrawDib);
	m_hDrawDib = NULL;
}
	
//////////////////////////////////////////////////////////////////////////

BOOL CAviPlayer::Prepare()
{
	AVIStreamInfo(
		m_pAviStream,
		&m_AviInfo,
		sizeof(m_AviInfo)
		);

	m_nRenderWidth = m_nAviWidth = m_AviInfo.rcFrame.right - m_AviInfo.rcFrame.left;
	m_nRenderHeight = m_nAviHeight = m_AviInfo.rcFrame.bottom - m_AviInfo.rcFrame.top;
	
	SetPlayerWindowPos(0,0,m_nRenderWidth,m_nRenderHeight);

	//get start position and count of frames
	m_nFrameNumber = AVIStreamStart( m_pAviStream );
	m_nFrameCount  = AVIStreamLength( m_pAviStream );
	
	m_pGetFrame =
		::AVIStreamGetFrameOpen(
		m_pAviStream,
		NULL
		);
	if( m_pGetFrame == NULL )
	{
		ASSERT( FALSE );
		AfxMessageBox( _T("AVI frame initialization failed"), MB_OK|MB_ICONERROR );
		return FALSE;
	}

	m_hDrawDib = ::DrawDibOpen();
	if( m_hDrawDib == NULL )
	{
		ASSERT( FALSE );
		AfxMessageBox( _T("DrawDibOpen() failed"), MB_OK|MB_ICONERROR );
		return FALSE;
	}	
	
	return TRUE;
}
	
//////////////////////////////////////////////////////////////////////////

BOOL CAviPlayer::OpenFromFile( LPCTSTR sAviFilePath )
{
	Clean();
	
	if( ::AVIStreamOpenFromFile(
		&m_pAviStream,
		sAviFilePath,
		streamtypeVIDEO,
		0,
		OF_READ,
		NULL
		) != 0
		)
	{
		Clean();
		ASSERT( FALSE );
		AfxMessageBox( _T("AVI stream initialization failed"), MB_OK|MB_ICONERROR );
		return FALSE;
	}
	BOOL bRet = Prepare();
	return bRet;
}

//////////////////////////////////////////////////////////////////////////

BOOL CAviPlayer::DrawFrame(
	HDC hDC,
	int nFrameNumber
	)
{
	LPBITMAPINFOHEADER lpbi;
	lpbi = (LPBITMAPINFOHEADER)
		::AVIStreamGetFrame(
		m_pGetFrame,
		nFrameNumber
		);

	if(!lpbi)
		return FALSE;

	unsigned char * pAviFrameRawData = (unsigned char *)
		lpbi
		+ lpbi->biSize
		+ lpbi->biClrUsed * sizeof(RGBQUAD);

	unsigned char * pDibRawData = NULL;
		
	HBITMAP hBitmap =
		::CreateDIBSection(
		hDC,
		(BITMAPINFO*)(lpbi),
		DIB_RGB_COLORS,
		(void**)(&pDibRawData),
		NULL,
		NULL
		);

	if( hBitmap == NULL )
	{
		ASSERT( FALSE );
		AfxMessageBox( _T("Failed to create DIB section"), MB_OK|MB_ICONERROR );
		return FALSE;
	}

	ASSERT( pDibRawData != NULL );

	::DrawDibDraw(
		m_hDrawDib,
		hDC,
		0, 0, m_nRenderWidth, m_nRenderHeight,
		lpbi,
		pAviFrameRawData,
		0, 0, m_nAviWidth, m_nAviHeight,
		0
		);

	DeleteObject(hBitmap);

	return TRUE;
}

//////////////////////////////////////////////////////////////////////////